/*! \file symboleValue.h
    \brief La spécification des symboles valués
   
    Décrit la liste des méthodes et attributs associés à la classe symbole valués
    \author Jamet + Koelsch
    \date 19/12/2012
 */

/*! \class symboleValue
    \brief La classe représentant les symboles valués.
   
    Cette classe permet de représenter sous la forme d'un objet un symbole valué
     Un symbole valué est un symbole qui a une valeur, définie ou pas
     et c'est aussi une feuille de l'arbre abstrait
    Les méthodes suivantes sont associées à un objet de type symbole valué :
    \li afficher
    \li getValeur
    \li setValeur
    \li estDefini
    */
    


#ifndef SYMBOLEVALUE_H
#define SYMBOLEVALUE_H

#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
using namespace std;

#include "Symbole.h"
#include "Arbre.h"
#include "Valeur.h"

class SymboleValue : public Symbole,  
                     public Noeud  {  
public:
    
                /*! \fn SymboleValue(Symbole s)
                \brief Constructeur de la classe SymboleValue
                \param s - le symbole existant
                */
	  SymboleValue(Symbole s); 
          
             /*! \fn ~SymboleValue()
                \brief Destructeur de la classe SymboleValue
              */         
	  ~SymboleValue() {}
          
              /*! \fn void afficher()
                \brief Affiche le symbole en tant que noeud de l'arbre
                \param indentation - valeur de l'indentation du noeud
             */
	  void        afficher (unsigned short indentation=0);                        
          
             /*! \fn int getValeur()
                \brief Accesseur de valeur
                \return  la valeur 
             */    
	  inline Valeur*  getValeur()                 { return valeur;                     } 
          
             /*! \fn void setValeur()
                \brief Modifie la valeur 
              
              Enregistre la nouvelle valeur, et met defini à vrai
                \param valeur - nouvelle valeur
             */
	  inline void setValeur(Valeur* valeur)       { this->valeur=valeur; defini=true;  } 
          
             /*! \fn bool estDefini()
                \brief Retourne si le symbole est défini ou non
                \return valeur de defini
             */
	  inline bool estDefini()                 { return defini;                     } 

          
             /*! \fn friend ostream & operator  (ostream & cout, SymboleValue symb)
                \brief Affiche un symbole value sur cout
             */
	  friend ostream & operator << (ostream & cout, SymboleValue symb); 
          
             /*! \fn tradC()
                \brief Traduit les noeuds reçus en code Ada compilable
             */
          void tradC(fstream &fichier);

private:
            /*! \var bool defini
               \brief  indique si la valeur du symbole est définie
             */
	  bool defini;     
          
            /*! \var int valeur
               \brief  valeur du symbole si elle est définie, zéro sinon
            */
	  Valeur*  valeur;	

};

#endif /* SYMBOLEVALUE_H */
